技巧102 记录Docker日志的输出
正如所见,Docker 提供了基本的日志记录系统来获取用户的容器的启动命令的输出。如果你是一名在一台宿主机上运行着多个服务的系统管理员,那么手工轮流在每个容器上执行 docker logs
命令来跟踪并获取日志操作起来可能很是烦琐。
在本技巧中,我们会讲解一下Docker的日志驱动程序特性。这让我们能够使用标准的日志记录系统来追踪某台宿主机(乃至跨多台宿主机)上的很多服务。
问题
想要在Docker宿主机上集中获取 docker logs
的输出。
解决方案
使用 -–log driver
标志重定向日志到需要的地方。
在默认情况下,Docker日志是在Docker守护进程内部被捕获的,可以通过 docker logs
命令来查看。读者可能已经注意到了,这展示的是容器主进程的输出。
编写本书时,Docker为重定向该输出到多个 日志驱动程序 提供了若干选择,包括:
- syslog;
- journald;
- json-file。
默认设置是json-file,但是其他两项也可以通过 --log-driver
标志来选择。syslog和journald选项会把日志输出发送到各自同名的守护进程。在Docker官方网站上可以找到所有可用的日志驱动程序的官方文档。
警告
本技巧需要Docker 1.6.1或更高版本。
syslog守护进程是运行在服务器上的一个进程,它会收集并管理发送到一个中心文件(通常是一个Unix域套接字)的所有消息。它一般会使用/dev/log作为接收日志消息的文件,并且把日志记录到/var/log/syslog。
journald是一个收集并存储日志记录数据的系统服务。它为不同来源的日志创建并维护一个结构严密的索引。这些日志可以通过 journalctl
命令来查询。
1.记录日志到syslog
为了把输出定向到syslog,需要使用 --log-driver
标志:
$ docker run --log-driver=syslog ubuntu echo 'outputting to syslog'
outputting to syslog
这会将输出记录在syslog文件中。如果有访问该文件的权限,可以通过标准Unix工具来检查这些日志:
$ grep 'outputting to syslog' /var/log/syslog
Jun 23 20:37:50 myhost docker/6239418882b6[2559]: outputting to syslog
2.记录日志到journald
输出到journal守护进程看起来类似这样:
$ docker run --log-driver=journald ubuntu echo 'outputting to journald'
outputting to journald
$ journalctl | grep 'outputting to journald'
Jun 23 11:49:23 myhost docker[2993]: outputting to journald
警告
确保在执行前面的命令之前宿主机上有一个journal守护进程在运行。
3.对所有的容器应用这些命令
为宿主机上所有的容器应用这一参数可能会十分费力,因此设置Docker守护进程默认输出日志到这些受支持的机制。
更改守护进程的/etc/default/docker,或者/etc/sysconfig/docker,或者用户自己的发行版设置的Docker配置文件。激活 DOCKER_OPTS=""
这一行,添加 --log-driver
标志。例如,如果这一行是
DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"
就变为
DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 --log-driver syslog"
提示
参见附录B以了解如何在宿主机上改变Docker守护进程的配置。
如果重启了Docker守护进程,容器会记录日志到相关服务。
讨论
另一个在这种情境下值得一提的通常做法(但在这里未做讲解)是可以使用容器实现一个ELK(Elasticsearch、Logstash和Kibana)日志记录基础设施。
警告
把守护进程的设置改成 json-flie
或 journald
之外的任何东西都将意味着默认情况下标准的 docker logs
命令将不起作用了。此Docker守护进程的用户可能并不喜欢这个变化,尤其是/var/log/syslog文件(被 syslog
驱动程序使用)通常对非root用户来说是无法访问的。